Amazon DynamoDB で GSI や LSI のキーは重複や値なしが許容されるのか確認してみた
こんにちは、CX 事業本部の若槻です。
今回は、Amazon DynamoDBで GSI(グローバルセカンダリインデックス)や LSI(ローカルセカンダリインデックス)のキーは重複や値なしが許容されるのか気になったので確認してみました。
確認してみた
次のような DynamoDB テーブルを使用して確認します。
{ "Table": { "AttributeDefinitions": [ { "AttributeName": "createdAt", "AttributeType": "N" }, { "AttributeName": "objectId", "AttributeType": "S" }, { "AttributeName": "objectType", "AttributeType": "S" }, { "AttributeName": "updatedAt", "AttributeType": "N" } ], "TableName": "object-master", "KeySchema": [ { "AttributeName": "objectType", "KeyType": "HASH" }, { "AttributeName": "createdAt", "KeyType": "RANGE" } ], "TableStatus": "ACTIVE", "CreationDateTime": 1594468590.571, "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 }, "TableSizeBytes": 404, "ItemCount": 4, "TableArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/object-master", "TableId": "2055b0a7-88c4-4223-920b-xxxxxxxxxxxx", "LocalSecondaryIndexes": [ { "IndexName": "LSI-objectType-updatedAt", "KeySchema": [ { "AttributeName": "objectType", "KeyType": "HASH" }, { "AttributeName": "updatedAt", "KeyType": "RANGE" } ], "Projection": { "ProjectionType": "ALL" }, "IndexSizeBytes": 404, "ItemCount": 4, "IndexArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/object-master/index/LSI-objectType-updatedAt" } ], "GlobalSecondaryIndexes": [ { "IndexName": "GSI-objectId", "KeySchema": [ { "AttributeName": "objectId", "KeyType": "HASH" } ], "Projection": { "ProjectionType": "ALL" }, "IndexStatus": "ACTIVE", "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "ReadCapacityUnits": 5, "WriteCapacityUnits": 5 }, "IndexSizeBytes": 404, "ItemCount": 4, "IndexArn": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/object-master/index/GSI-objectId" } ] } }
キーの仕様を抜粋すると以下のとおりです。
- プライマリパーティションキー:
objectType
- プライマリソートキー:
createdAt
GSI-objectId
パーティションキー:objectId
LSI-objectType-updatedAt
ソートキー:updatedAt
事前にテーブルには次のようにアイテムを登録しました。
重複するキーの登録
GSIのキーを重複させてみる
GSI のキーobjectId
が重複するようにアイテムを登録してみます。
$ aws dynamodb put-item --table-name object-master \ --item '{"objectType": {"S": "Group"}, "createdAt": {"N": "55555555"}, "objectId": {"S": "g0001"}, "updatedAt": {"N": "55555555"}}'
登録できました。GSI のキーが重複するアイテムが併存できています。
GSI のキーでクエリをしてみると、GSI のキーが重複しているアイテムがすべて取得できました。
LSIのキーを重複させてみる
LSI のキーobjectType
+updatedAt
が重複するようにアイテムを登録してみます。
$ aws dynamodb put-item --table-name object-master \ --item '{"objectType": {"S": "User"}, "createdAt": {"N": "66666666"}, "objectId": {"S": "u0003"}, "updatedAt": {"N": "66666666"}}'
テーブルに登録できました。LSI のキーが重複するアイテムが併存できています。
LSI のキーでクエリをしてみると、LSI のキーが重複しているアイテムがすべて取得できました。
GSIおよびLSIのキーを値なしにしてみる
プライマリキーobjectType
+createdAt
のみ値を持ったアイテムを登録してみます。
$ aws dynamodb put-item --table-name object-master \ --item '{"objectType": {"S": "User"}, "createdAt": {"N": "77777777"}}'
テーブルに登録できました。
GSI でスキャンした場合は取得できませんでした。GSI のキーを持っていないアイテムは GSI には登録されないようです。
同様に、LSI でスキャンした場合も取得できませんでした。
まとめ
- GSI や LSI のキーが重複していたり値なしのアイテムもテーブルに登録可能。
- キーが重複しているアイテムでもインデックスの検索ですべて取得可能。
- キーの値なしのアイテムはインデックスの検索では取得不可。
参考
- コンセプトから学ぶAmazon DynamoDB【インデックス俯瞰篇】 | Developers.IO
- aws . dynamodb put-item | AWS CLI Command Reference
- AWS CLIでDynamoDB操作(挿入, 取得, 更新, 削除) | わくわくBank.
以上